Completed
Push — master ( 4fbfdd...b52df4 )
by Andres
29s
created

angular.controller(ꞌct_fusionꞌ)   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
c 1
b 0
f 0
nc 2
dl 0
loc 14
rs 9.4285
nop 1
1
/**
2
 fusion
3
 Component that handles the fusion of isotopes to create new ones.
4
5
 @namespace Components
6
 */
7
'use strict';
8
9
angular.module('game').component('fusion', {
10
  templateUrl: 'views/fusion.html',
11
  controller:  'ct_fusion',
12
  controllerAs: 'ct'
13
});
14
15
angular.module('game').controller('ct_fusion', ['state', 'format', 'visibility', 'data', 'util', 'reaction',
16
  function (state, format, visibility, data, util, reactionService) {
17
    let ct = this;
18
    ct.state = state;
19
    ct.data = data;
20
    ct.util = util;
21
    ct.format = format;
22
23
    ct.getReactorArea = function(player) {
24
      let level = player.global_upgrades.fusion_area;
25
      let upgrade = data.global_upgrades.fusion_area;
26
      let basePower = upgrade.power;
27
      let multiplier = upgrade.power_mult;
28
      return basePower * Math.floor(multiplier * level);
29
    };
30
31
    ct.getBandwidth = function(player){
32
      // FIXME FIXME
33
      return 1e7;
34
        let level = player.global_upgrades.fusion_bandwidth;
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
Bug introduced by
The variable player seems to be never initialized.
Loading history...
35
        let upgrade = data.global_upgrades.fusion_bandwidth;
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
36
        let basePower = upgrade.power;
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
37
        let exp = upgrade.power_exp;
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
38
        return basePower * Math.pow(exp, level);
0 ignored issues
show
introduced by
This code is unreachable and can thus be removed without consequences.
Loading history...
39
    }
40
41
    function getRadius(resource) {
42
      let isotope = data.resources[resource];
43
      let A = isotope.energy/data.constants.U_TO_EV;
44
      return data.constants.FERMI_RADIUS * Math.pow(A, 0.3333);
45
    }
46
47
    function getZ(resource){
48
      let isotope = data.resources[resource];
49
      let element = Object.keys(isotope.elements)[0];
50
      return data.elements[element].number;
51
    }
52
53
    ct.getCapacity = function(resource, player) {
54
      let r = getRadius(resource);
55
      let area = Math.PI*r*r;
56
      return ct.getReactorArea(player)/area;
57
    };
58
59
    ct.getTime = function(player) {
60
      let time = ct.getFusionReaction(player).reactant.eV/ct.getBandwidth(player);
61
      time = Math.floor(time);
62
      return Math.max(1, time);
63
    }
64
65
    ct.getProductIsotope = function(beam, target) {
66
      let beamN = parseInt(beam, 10);
67
      let targetN = parseInt(target, 10);
68
69
      let beamZ = getZ(beam);
70
      let targetZ = getZ(target);
71
72
      let productN = beamN+targetN;
73
      let productZ = beamZ+targetZ;
74
75
      return data.resource_matrix[productZ][productN];
76
    };
77
78
    ct.getProductEnergy = function(beam, target) {
79
      let product = ct.getProductIsotope(beam, target);
80
      if(!product){
81
        return 0;
82
      }
83
      let beamBE = data.resources[beam].binding_energy;
84
      let targetBE = data.resources[target].binding_energy;
85
      let productBE = data.resources[product].binding_energy;
86
87
      return productBE - (beamBE + targetBE);
88
    };
89
90
    ct.getCoulombBarrier = function(beam, target) {
91
      let beamZ = getZ(beam);
92
      let beamR = getRadius(beam);
93
94
      let targetZ = getZ(target);
95
      let targetR = getRadius(target);
96
97
      let coulombBarrier = data.constants.COULOMB_CONSTANT*beamZ*targetZ*
98
              Math.pow(data.constants.ELECTRON_CHARGE, 2)/(beamR+targetR);
99
      return coulombBarrier * data.constants.JOULE_TO_EV;
100
    };
101
102
    ct.getYieldPercent = function(player) {
103
      let beam = state.player.fusion[0].beam;
104
      let target = state.player.fusion[0].target;
105
      let beamR = getRadius(beam.name);
106
      let targetR = getRadius(target.name);
107
      let beamArea = Math.PI*beamR*beamR;
108
      let targetArea = Math.PI*targetR*targetR;
109
110
      let beamPercentArea = beamArea*beam.number/ct.getReactorArea(player);
111
      let targetPercentArea = targetArea*target.number/ct.getReactorArea(player);
112
113
      return beamPercentArea*targetPercentArea;
114
    };
115
116
    ct.getYield = function(player){
117
      let percentYield = ct.getYieldPercent(player);
118
      let target = state.player.fusion[0].target;
119
      return Math.floor(percentYield*target.number);
120
    };
121
122
    ct.getFusionReaction = function(player) {
123
      let reaction = {
124
        reactant: {},
125
        product: {}
126
      };
127
128
      let beam = state.player.fusion[0].beam;
129
      let target = state.player.fusion[0].target;
130
131
      reaction.reactant[beam.name] = beam.number;
132
      reaction.reactant[target.name] = target.number;
133
134
      let coulombBarrier = ct.getCoulombBarrier(beam.name, target.name);
135
      reaction.reactant.eV = coulombBarrier*beam.number;
136
137
      let product = ct.getProductIsotope(beam.name, target.name);
138
      let numberYield = ct.getYield(player);
139
140
      reaction.product[product] = numberYield;
141
142
      let energyExchange = ct.getProductEnergy(beam.name, target.name);
143
      if(energyExchange < 0){
144
        reaction.reactant.eV += energyExchange*numberYield;
145
      }else if(energyExchange > 0){
146
        reaction.product.eV = energyExchange*numberYield;
147
      }
148
149
      return reaction;
150
    };
151
152
    function activateFusion(player){
153
      let beam = player.fusion[0].beam;
154
      let target = player.fusion[0].target;
155
156
      if(player.resources[beam.name].number < beam.number ||
157
        player.resources[target.name].number < target.number){
158
        player.fusion[0].running = false;
159
        return;
160
      }
161
      player.resources[beam.name].number -= beam.number;
162
      player.resources[target.name].number -= target.number;
163
164
      player.fusion[0].running = true;
165
    }
166
167
    ct.stopFusion = function(player, fusion) {
168
      if(fusion.running){
169
        let beam = state.player.fusion[0].beam;
170
        let target = state.player.fusion[0].target;
171
172
        player.resources[beam.name].number += fusion.beam.number
173
        player.resources[target.name].number += fusion.target.number
174
      }
175
176
      fusion.eV = 0;
177
      fusion.active = false;
178
      fusion.running = false;
179
      fusion.run = false;
180
    }
181
182
    function updateFusion(player, fusion) {
183
        let bandwidth = ct.getBandwidth(player);
184
        let spent = Math.min(player.resources.eV.number, bandwidth);
185
        fusion.eV += spent;
186
        player.resources.eV.number -= spent;
187
    }
188
189
    function endFusion(player, fusion, reaction) {
190
      // energy is not lost! if there are leftovers, give them back to the player
191
      let leftover = fusion.eV - reaction.reactant.eV;
192
      reaction.product.eV = reaction.product.eV + leftover || leftover;
193
      // Reaction checks that the player has the quantity necessary
194
      // to react, but here eV is stored in the fusion object. By setting the cost to 0
195
      // we make sure that it always work
196
      reaction.reactant= {eV:0};
197
      reactionService.react(1, reaction, player);
198
199
      fusion.eV = 0;
200
      player.fusion[0].running = false;
201
    }
202
203
    function update(player){
204
      for(let fusion of player.fusion){
205
        if(!fusion.active){
206
          continue;
207
        }
208
        if(fusion.eV === 0 && fusion.run){
209
          activateFusion(player);
210
        }
211
        if(!fusion.running){
212
          continue;
213
        }
214
        updateFusion(player, fusion);
215
        let reaction = ct.getFusionReaction(player);
216
        if(fusion.eV >= reaction.reactant.eV){
217
          endFusion(player, fusion, reaction)
218
        }
219
      }
220
    }
221
222
    state.registerUpdate('fusion', update);
223
  }
224
]);
225